package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func test2() {
	for i := 0; i < 5; i++ {
		fmt.Println("test执行", i)
	}
	// Done将WaitGroup计数器减1。
	wg.Done()
}

func main() {
	// sync.WaitGroup 完美解决，以后在项目中也会经常使用
	// Add向WaitGroup计数器添加delta，该值可能为负值。
	//如果计数器变为0，所有被Wait阻塞的例程将被释放。
	//如果计数器为负，则添加panic。
	//
	//注意，当计数器为零时，调用的增量为正
	//必须发生在Wait之前。以负增量调用，或者以a调用
	//当计数器大于0时，可能会出现正增量
	//在任何时候。
	//通常，这意味着对Add的调用应该在语句之前执行
	//创建要等待的程序或其他事件。
	//如果一个WaitGroup被重用来等待几个独立的事件集，
	//新的Add调用必须在所有之前的Wait调用返回后发生。
	//参见WaitGroup的例子。
	wg.Add(1)
	go test2()
	for i := 0; i < 5; i++ {
		fmt.Println("main执行", i)
	}
	// 等待直到WaitGroup计数器为零。这样就可以解决主线程执行完毕后，不等待等待协程执行完毕就退出的问题。
	wg.Wait()

}
